package jp.ac.waseda.cs.washi.game.ai;

import jp.ac.waseda.cs.washi.game.api.*;
import jp.ac.waseda.cs.washi.gameaiarena.api.Direction4;
import jp.ac.waseda.cs.washi.gameaiarena.api.Point2;

public class Sample implements Player {

	Direction4[] directions;
	PlayerAction[] actions;
	int indexOfDirections = 0;
	int indexOfActions = 0;
	Direction4[] fourDirections = Direction4.values();

	// ボーナス図形を作るための一連の動きを表す配列
	PlayerAction[] bonusMakeActions = { PlayerAction.LEFT, PlayerAction.LEFT,
			PlayerAction.CLEAR, PlayerAction.UP, PlayerAction.RIGHT,
			PlayerAction.CLEAR, PlayerAction.UP, PlayerAction.RIGHT,
			PlayerAction.CLEAR, PlayerAction.RIGHT, PlayerAction.DOWN,
			PlayerAction.CLEAR, PlayerAction.RIGHT, PlayerAction.DOWN,
			PlayerAction.CLEAR, PlayerAction.DOWN, PlayerAction.LEFT,
			PlayerAction.CLEAR, PlayerAction.DOWN, PlayerAction.LEFT,
			PlayerAction.CLEAR, PlayerAction.LEFT, PlayerAction.UP,
			PlayerAction.CLEAR, };

	@Override
	public void initialize(GameInfo env) {
	}

	@Override
	public PlayerAction execute(GameInfo env) {

		// ゲーム環境から最新の情報を取得します。
		MapInfo map = env.getMap();
		CharaInfo mychara = env.getPlayer();
		CharaInfo enemy = env.getEnemy();

		// ボーナス図形を作っている場合は取得した配列に従って行動します。
		if (actions != null) {
			if (indexOfActions < actions.length) {
				return actions[indexOfActions++];
			} else {
				actions = null;
				indexOfActions = 0;
				// 作ったボーナスを壊さないように離れた場所へ移動します(ランダムな位置)
				directions = map.getPath(mychara.getLocation(),
						new Point2((int) (Math.random() * map.getWidth()),
								(int) (Math.random() * map.getHeight())));
			}
		}

		// 目的地がある場合は取得した配列に従って行動します。
		if (directions != null) {
			if (indexOfDirections < directions.length) {
				return PlayerAction
						.fromDirection(directions[indexOfDirections++]);
			} else {
				directions = null;
				indexOfDirections = 0;
			}
		}

		// 敵の持つボーナス図形の数が３つより多かったらボーナスの破壊先を見つけます。
		if (enemy.getPumpkins().size() > 3) {
			directions = map.getPath(mychara.getLocation(), enemy.getPumpkins()
					.get(0).getCenterLocation());
		}

		// 自分の持つ小さなボーナス図形の数が3個よりより多くなったら何もしないで様子を見ます。
		if (mychara.getMiniPumpkins().size() > 3) {
			return PlayerAction.NONE;
		}

		// 自分の足元に自分の魔法陣がない場合は魔法陣を作ります。
		if (map.getCompleteOwner(mychara.getLocation()) != mychara
				&& map.canDevelop(mychara.getLocation())) {
			if (!mychara.getLocation().equals(enemy.getLocation())) {
				return PlayerAction.SPELL;
			}
		}

		// それ以外の場合はタイルがnullであるマスの方へ進みます。
		for (Direction4 direction : fourDirections) {
			Point2 aroundPoint = mychara.getLocation().add(direction.toPoint());
			if (map.getCompleteOwner(aroundPoint) != mychara
					&& map.isMovable(aroundPoint))
				return PlayerAction.fromDirection(direction);
		}

		// 周りのマスがすべて自分の魔法陣だった場合、ボーナス図形を作る行動に移ります。
		actions = bonusMakeActions;

		return PlayerAction.NONE;

	}

	// プレイヤーを指定してゲームをスタートします。
	public static void main(String[] args) {
		GameInvoker.startForDebug(new Sample(), null, 1);
	}
}
